/**
 *  在kotlin中所有东西都是对象，在这个意义上讲所以我们可以在任何变量上调用成员函数和属性。有些类型是内置的，因为他们的实现是优化过的。
 *  但是用户看起来他们就像普通的类。本节学习的类型有：数字、字符、布尔和数组。
 *  该篇学习地址：https://www.5axxw.com/wiki/content/njfpv7
 *
 */
fun main(args: Array<String>) {


    /**
     * Tips: 所有未超过 int 最大值的整型值初始化的变量都默认为Int类型，如果初始值超过了其最大值，那么推断为Long类型。
     *       在数字值后面显示添加L表示一个Long类型
     *
     *       类型                 大小（占用比特数）               最小值                        最大值
     *       Byte                     8                          -128                          127
     *       Short                    16                        -32768                        32767
     *       Int                      32                        -2147483648                 2147483647
     *       Long                     64                -9,223,372,036,854,775,808     9,223,372,036,854,775,807
     *
     *   3.1 正数类型
     */
    val number = 100 //默认是int类型
    val bigNumber = 8000000000 //超过int 最大值默认是Long类型
    val longNumber = 20L //数字后面显示加L，表示声明Long类型
    val byteNumber: Byte = 1


    /**
     *
     * 3.2 浮点数类型
     * kotlin提供了Float 和 Double 两种类型来分别表示单精度和双精度的浮点数类型
     *
     * Kotlin 对于默认小数的推断是Double类型。如果需要显式将一个小数指定为Float类型需要在数值尾部加入f或F。
     * 由于Float类型十进制位数是6~7，所以下述例子中floatNumber实际值大小为2.3423344，后面就会出现进度丢失舍弃。
     */
    val pi = 3.1415926  //默认是Double类型
    val doubleNumber = 1.23343434343   //默认是Double类型
    val floatNumber = 2.3423344378f  //尾部加f或F显示表示这是一个Float类型的浮点数

    /**
     * 在 Kotlin 中还有一点与 Java 不同的是，Kotlin 中数字不存在隐式的拓宽转换。比如一个函数参数为Double 的函数只能接收
     * Double 类型，不能接收 Float、Int 或者其他数字类型。
     */
//    testType(100)  //Java可以编译通过，Kotlin编译不通过，类型不匹配, 数值必须指定为double，100.0就ok
    testType(100.0)

    /**
     *
     * 3.3 数字常量
     * 在 Kotlin 支持数字的十进制、二进制、十六进制的表示，但是注意 Kotlin 不支持八进制的表示。
     *
     *            进制表示              十进制             二进制             十六进制
     *              示例                 100            0b00001001            0x0F
     *
     *  在 Kotlin 为了使得数字常量更易可读，可以使用下划线将数字隔开。
     *
     */
    val bigNum = 3_000_000_000
    println("bigNum:" + bigNum)
    val bytesNumber = 0b11010010_01101111_0001001_10001000
    val hexNumber = 0xFF_EF_D7_3F


    /**
     *
     *
     * 3.4数字类型强制转换
     *
     * 在 Kotlin 中与 Java 不同是通过调用 toInt、toDouble、toFloat 之类函数来实现数字类型的强制转换的。
     *
     * 缺乏隐式类型转换很少会引起注意，因为类型会从上下文推断出来，而算术运算会有重载做适当转换，例如：
     *
     */
//    val number = 20L + 40  // Long  + Int => Long


    /**
     *
     * 3.5数字运算
     *
     */
    //四则运算-除法/
    val number2 = 3 / 2
    println(number2)  //输出1
    val floatNumber2 = 3 / 2.toDouble()
    println(floatNumber2)   //输出1.5

    //四则运算-乘法*
    val number3 = 3 * 2
    println(number3)   //输出6

    //四则运算-加法+
    val number4 = 3 + 2
    println(number4)   //输出5

    //四则运算-减法-
    val number5 = 3 - 2
    println(number5)    //输出1

    //四则运算-取余%
    val number6 = 3 % 2
    println(number6)     //输出1

    /**
     * 位运算
     * Kotlin 中的位运算和 Java 不同的是没有用特殊符号来表示，可以采用了中缀函数方式调用具名函数。
     *
     * shl(bits) – 有符号左移；
     * shr(bits) – 有符号右移；
     * ushr(bits) – 无符号右移；
     * and(bits) – 位与；
     * or(bits) – 位或；
     * inv() – 位非；
     * xor(bits) – 位异或。
     */
    val number100 = (3 shr 4) and 0x000EF000
    println(number100)   //输出0


}


fun testType(number: Double) {
    println(number)
}




































